package ijij41.chat;

import ijij41.network.*;
import ijij41.togetherTrain.*;

import java.util.*;

import org.jivesoftware.smack.*;
import org.jivesoftware.smack.filter.*;
import org.jivesoftware.smack.packet.*;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.util.*;

import android.app.*;
import android.os.*;
import android.util.*;
import android.view.*;
import android.widget.*;


//UI 구조
//현재 구조는 message ArrayList를 만들어서 이것을 통해 Adaptor를 만들고
//그것을 List에 달아 계속 화면에 책팅이 가능 하도록 한다.


//특정 챗팅방에 들어 가서 (각 열차 정보당 하나의 챗팅방만이 존재 한다)
//방에 참여를 하여 등록 되는 순간 챗팅방 목록에 들어간다. (여기 정보는 로그인이 되어 있는지 아닌지 구분된다)
//해당 방에는 임시 사용자도 등록 될수 있는데,  사용자가 접속된 상태에서 챗팅방에 참여 했을 경우 챗팅방 목록에 유지되고
//사용자가 나가거나 사용자가 접속되지 않은 상태 챗팅목록에서는 삭제 된다.

//TODO 챗팅 자체 보다는 챗팅방의 목록을 잘 유지 하고 있는지 하는 부분을 먼저 개발하고,
//챗팅방 인원관리만 잘되면, 메세지를 그들에게 보내는것은 러렵지 않다.


public class ChatActivity extends Activity implements NetworkInformation {

	private ArrayList<String> messages = new ArrayList();
	private Handler mHandler = new Handler();
	private EditText mRecipient;
	private EditText mSendText;
	private ListView mList;
	private XMPPConnection connection;
	private EditText mSender;

	/**
	 * Called with the activity is first created.
	 */
	@Override
	public void onCreate(Bundle icicle) {

		super.onCreate(icicle);		
		setContentView(R.layout.chat);

		initComponent();
		

	}

	
	private void initComponent() {
				
		mSender = (EditText) this.findViewById(R.id.sender);
		Log.i("XMPPClient", "mRecipient = " + mRecipient);
		mSendText = (EditText) this.findViewById(R.id.sendText);
		Log.i("XMPPClient", "mSendText = " + mSendText);
		mList = (ListView) this.findViewById(R.id.listMessages);
		Log.i("XMPPClient", "mList = " + mList);
		setListAdapter();

	
		findViewById(R.id.connect_btn).setOnClickListener(mClickListener);
		findViewById(R.id.btn_back_img).setOnClickListener(mClickListener);
		// Set a listener to send a chat text message		
		findViewById(R.id.send).setOnClickListener(mClickListener);
		
	}

	
	
	/**
	 * Called by Settings dialog when a connection is establised with the XMPP
	 * server
	 * 
	 * @param connection
	 */
	private void setConnection(XMPPConnection connection) {
		this.connection = connection;
		if (connection != null) {
			// Add a packet listener to get messages sent to us
			PacketFilter filter = new MessageTypeFilter(Message.Type.chat);
			connection.addPacketListener(new PacketListener() {
				public void processPacket(Packet packet) {
					Message message = (Message) packet;
					if (message.getBody() != null) {
						String fromName = StringUtils.parseBareAddress(message
								.getFrom());
						Log.i("XMPPClient", "Got text [" + message.getBody()
								+ "] from [" + fromName + "]");
						messages.add(fromName + ":");
						messages.add(message.getBody());
						// Add the incoming message to the list view
						mHandler.post(new Runnable() {
							public void run() {
								setListAdapter();
							}
						});
					}
				}
			}, filter);
		}
	}
	

	private void setListAdapter() {
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
				R.layout.multi_line_list_item, messages);
		mList.setAdapter(adapter);
	}
	

	private XMPPConnection tryConnection(String user) {

		// Create a connection
		ConnectionConfiguration connConfig = new ConnectionConfiguration(
				NetworkInformation.host,
				Integer.parseInt(NetworkInformation.port),
				NetworkInformation.service);
		
		XMPPConnection connection = new XMPPConnection(connConfig);

		try {
			connection.connect();
			Log.i("XMPPClient",
					"[SettingsDialog] Connected to " + connection.getHost());
		} catch (XMPPException ex) {
			Log.e("XMPPClient", "[SettingsDialog] Failed to connect to "
					+ connection.getHost());
			Log.e("XMPPClient", ex.toString());
			return null;
			// xmppClient.setConnection(null);
		}

		try {

			connection.login(user, "1234");
			Log.i("XMPPClient", "Logged in as " + connection.getUser());

			// Set the status to available
			Presence presence = new Presence(Presence.Type.available);
			connection.sendPacket(presence);
			// xmppClient.setConnection(connection);
			return connection;
		} catch (XMPPException ex) {
			Log.e("XMPPClient", "[SettingsDialog] Failed to log in as "
					+ NetworkInformation.username);
			Log.e("XMPPClient", ex.toString());
			// xmppClient.setConnection(null);
			return null;
		}

	}

	
	
	private Button.OnClickListener mClickListener = new Button.OnClickListener() {
		@Override
		public void onClick(View v) {
			switch (v.getId()) {

			case R.id.btn_back_img:
				finish();
				break;

			case R.id.connect_btn:				
				connection();
				break;
				
			case R.id.send:
				sendMesseage();
				break;
				
				

			default:
				break;
			}

		}

		
		
		private void connection() {
			if (connection == null) {
				XMPPConnection conn = tryConnection(mSender.getText()
						.toString());
				if (conn != null) {
					setConnection(conn);

					group_user.add("test");
					group_user.add("test1");
					group_user.add("test2");
					group_user.add("test3");

					Toast.makeText(ChatActivity.this, "Connection Success",
							Toast.LENGTH_SHORT).show();
				}
			} else {
				Toast.makeText(ChatActivity.this, "Already Connection : "+mSender.getText().toString(),
						Toast.LENGTH_SHORT).show();
			}

			
		}


		
		

		private void sendMesseage() {
			
			// TODO thread로 만들어야 한다.
			Log.i("XMPPClient", "send message");

			String text = mSendText.getText().toString();

						
			for (int i = 0; i < group_user.size(); i++) {
				
				String to = group_user.get(i);
				if (!to.equals(mSender.getText().toString())) {
					Log.i("XMPPClient", "Sending text [" + text + "] to ["
							+ to + "]");
					StringBuffer sb = new StringBuffer();
					sb.append(to);
					sb.append("@cats-test4.kaist.ac.kr");
					Message msg = new Message(sb.toString(),
							Message.Type.chat);
					msg.setBody(text);
					connection.sendPacket(msg);
				}
				
			}

			//messages.add(connection.getUser() + ":");
			//messages.add(text);

			setListAdapter();
			
		}
	};

}
